package com.loan.common;


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.*;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 时间工具类
 * <p>
 * 1、获取当前日期
 * 2、获取当前时间 格式： yyyyMMddHHmmss
 * 3、获取当前时间 格式： 自定义
 * 4、将字符串转换成固定格式时间
 * 5、将字符串转换成固定格式时间
 * 6、Date类型转换String 格式：yyyyMMdd
 * 7、Date类型转换String 格式：自定义
 * 8、增加时间
 * 9、按秒偏移,根据{@code source}得到{@code seconds}秒之后的日期<Br>
 * 10、根据传入的时分秒毫秒获取固定的当日时间点
 * </p>
 * User: zhangmaoquan Date: 2019-04-09 ProductName: ReportCenter Version: 1.0
 */
@Slf4j
public class DateUtil {

    /**
     * 日期格式：yyyyMM
     */
    public static final String YEAR_PATTERN = "yyyy";

    /**
     * 日期格式：yyyyMM
     */
    public static final String MONTHS_PATTERN = "yyyyMM";
    /**
     * 日期格式：yyyyMMdd
     */
    public static final String DATE_PATTERN = "yyyyMMdd";
    /**
     * 日期时间格式：yyyyMMddHHmmss
     */
    public static final String FULL_PATTERN = "yyyyMMddHHmmss";
    /**
     * 日期时间格式：yyyyMMddHHmmss
     */
    public static final String READ_PATTERN = "yyyy-MM-dd HH:mm:ss,SSS";

    /**
     * 日期时间格式：yyyy-MM-dd
     */
    public static final String DATE_SHOW_FORMAT = "yyyy-MM-dd";

    /**
     * 日期时间格式：yyyy/MM/dd
     */
    public static final String DATE_FORMAT = "yyyy/MM/dd";

    /**
     * 日期格式：yyyy-MM-dd HH:mm:ss
     */
    public static final String STANDARD_PATTERN = "yyyy-MM-dd HH:mm:ss";

    /**
     * 日期时间格式：yyyy-MM
     */
    public static final String MONTH_SHOW_FORMAT = "yyyy-MM";

    /**
     * 日期时间格式：yyyy.MM.dd
     */
    public static final String MONTH_POINT_FORMAT = "yyyy.mm.dd";

    /**
     * 获取当前日期
     *
     * @return 当前日期
     */
    public static Date getCurrentDate() {
        return DateTime.now().toDate();
    }

    /**
     * 获取当前时间 格式： yyyyMMddHHmmss
     *
     * @return 字符日期 格式：yyyyMMddHHmmss
     */
    public static String getCurrent() {
        return getCurrent(FULL_PATTERN);
    }

    /**
     * 获取当前时间 格式： 自定义
     *
     * @param pattern 时间格式
     * @return 自定义格式的当前时间
     */
    public static String getCurrent(String pattern) {
        return DateTime.now().toString(pattern);
    }

    /**
     * 将字符串转换成固定格式时间
     *
     * @param date    日期
     * @param pattern 自定义格式
     * @return 转换后日期
     */
    public static Date parse(String date, String pattern) {
        if (null == date) {
            return null;
        }
        DateTime dateTime = parseTime(date, pattern);
        return dateTime.toDate();
    }

    /**
     * 将字符串转换成固定格式时间
     *
     * @param date    日期
     * @param pattern 自定义格式
     * @return 转换后日期
     */
    public static DateTime parseTime(String date, String pattern) {
        return DateTimeFormat.forPattern(pattern).parseDateTime(date);
    }

    /**
     * Date类型转换String 格式：yyyyMMdd
     *
     * @param date 日期
     * @return String类型
     */
    public static String defaultFormat(Date date) {
        if (null == date) {
            return null;
        }
        return new DateTime(date).toString(DATE_PATTERN);
    }

    /**
     * Date类型转换String 格式：自定义
     *
     * @param date    日期
     * @param pattern 自定义格式
     * @return String类型
     */
    public static String format(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        return new DateTime(date).toString(pattern);
    }

    /**
     * Date类型转换String 格式：自定义
     *
     * @param date    日期
     * @param pattern 自定义格式
     * @return String类型
     */
    public static String formatMont(Date date, String pattern) {
        if (date == null) {
            return null;
        }
        return new DateTime(date).toString(MONTHS_PATTERN);
    }

    /**
     * 获取当前时间
     *
     * @return Date
     */
    public static Date getCurrentDate(String pattern) {
        DateTimeFormatter format = DateTimeFormat.forPattern(pattern);
        return DateTime.parse(new DateTime().toString(pattern), format).toDate();
    }

    /**
     * 根据 pattern 将 dateTime 时间进行格式化
     * 用来去除时分秒，具体根据结果以 pattern 为准
     *
     * @param date payDate 时间
     * @return payDate 时间
     */
    public static Date formatToDate(Date date, String pattern) {
        DateTimeFormatter format = DateTimeFormat.forPattern(pattern);
        return DateTime.parse(new DateTime(date).toString(pattern), format).toDate();
    }

    /**
     * 日期增减，负数为减
     *
     * @param dayNum 天数
     * @return 时间
     */
    public static Date plusDays(int dayNum) {
        return new DateTime().plusDays(dayNum).toDate();
    }

    /**
     * 日期增减，负数为减
     *
     * @param date  日期
     * @param hours 小时
     * @return 时间
     */
    public static Date plusHours(Date date, int hours) {
        return new DateTime(date).plusHours(hours).toDate();
    }

    /**
     * 日期增减，负数为减
     *
     * @param date    日期
     * @param minutes 分钟
     * @return 时间
     */
    public static Date plusMinutes(Date date, int minutes) {
        return new DateTime(date).plusHours(minutes).toDate();
    }


    /**
     * 日期增减，负数为减
     *
     * @param dayNum 天数
     * @return 时间
     */
    public static Date plusDays(Date date, int dayNum) {
        return new DateTime(date).plusDays(dayNum).toDate();
    }


    /**
     * 获取当前时间距离一天结束的剩余毫秒数
     *
     * @param currentDate 当前时间
     * @return 剩余毫秒数
     */
    public static long getRemainSecondsOneDay(Date currentDate) {
        Calendar midnight = Calendar.getInstance();
        midnight.setTime(currentDate);
        midnight.add(Calendar.DAY_OF_MONTH, 1);
        midnight.set(Calendar.HOUR_OF_DAY, 0);
        midnight.set(Calendar.MINUTE, 0);
        midnight.set(Calendar.SECOND, 0);
        midnight.set(Calendar.MILLISECOND, 0);
        return midnight.getTime().getTime() - currentDate.getTime();
    }

    /**
     * @param date 获取给定日期的起初时间 XX-XX-XX 00:00:00
     * @return date
     */
    public static Date getBegin(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        return calendar.getTime();
    }


    /**
     * 获取上个月的最后一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getLastDayOfLastMonth(String date) throws ParseException {
        date = date.replaceAll("[-]", "");
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        cal.setTime(sdf.parse(date));
        cal.add(Calendar.MONTH, -1);
        int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, day);
        return sdf.format(cal.getTime());
    }


    /**
     * 获取上个月的最后一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getStartDayOfLastMonthaa(Date date) {
        Calendar cal_1 = Calendar.getInstance();//获取当前日期
        cal_1.setTime(date);
        cal_1.add(Calendar.MONTH, 0);
        cal_1.set(Calendar.DAY_OF_MONTH, 0);//设置为1号,当前日期既为本月第一天
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(cal_1.getTime());
    }

    /**
     * 获取上个月的最后一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static Date getLastDayOfDateLastMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, -1);
        int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, day);
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 59);
        cal.set(Calendar.SECOND, 59);

        return cal.getTime();
    }

    /**
     * 获取上个月的最后一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     */
    public static Date getLastDayLastMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, -1);
        int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, day);
        return formatToDate(cal.getTime(), DATE_SHOW_FORMAT);
    }

    /**
     * 获取上月的第一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getFirstDayOfLastMonth(String date) throws ParseException {
        date = date.replaceAll("[-]", "");
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        cal.setTime(sdf.parse(date));
        cal.add(Calendar.MONTH, -1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        return sdf.format(cal.getTime());
    }

    /**
     * 获取上个月的第一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getStartDayOfLastMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
        cal.setTime(date);
        cal.add(Calendar.MONTH, -1);
        int day = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, day);
        return sdf.format(cal.getTime());
    }

    /**
     * 获取上个月的第一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static Date getStartOfLastMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, -1);
        int day = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, day);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return cal.getTime();
    }


    /**
     * 把数字格式化时间
     *
     * @param date 数字
     * @return Date
     */
    public static Date getFomartDate(String date) {
        int dayOfMonth = -1;
        if (date != null && !"".equals(date)) {
            if (date.contains("/")) {
                return DateUtil.parse(date, DateUtil.DATE_FORMAT);
            } else if (date.contains("-")) {
                return DateUtil.parse(date, DateUtil.DATE_SHOW_FORMAT);
            } else {
                Calendar calendar = new GregorianCalendar(1900, 0, dayOfMonth);
                calendar.add(5, Integer.parseInt(date));
                Date time = calendar.getTime();
                return time;
            }
        }
        return null;
    }

    /**
     * 获取上个月的周期
     *
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getDayOfLastMonth(String date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(DateUtil.parse(date, DATE_PATTERN));
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
        int eday = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, eday);
        return sdf.format(cal.getTime());
    }


    /**
     * 获取当月第一天日期
     *
     * @param date   日期
     * @param format 格式
     * @return 日期对象
     */
    public static Date getMonthFirstDay(Date date, String format) {

        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return formatToDate(calendar.getTime(), format);
    }


    public static String getFirstDayOfMonth(Date date, String format) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.MONTH, 0);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        return format(calendar.getTime(), format);
    }

    /**
     * 返回当月最后一天的日期
     *
     * @param date 日期
     * @return 返回当月最后一天的日期
     */
    public static Date getLastDayOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        return calendar.getTime();
    }

    /**
     * 返回当月最后一天的日期
     *
     * @param date 日期:格式yyyyMM
     * @return 返回当月最后一天的日期:格式yyyyMMdd
     */
    public static String getLastDayOfCurrentMonth(String date) {
        Date parse = DateUtil.parse(date, DateUtil.DATE_SHOW_FORMAT);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(parse);
        calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
        Date time = calendar.getTime();
        return DateUtil.format(time, DateUtil.DATE_SHOW_FORMAT);
    }


    /**
     * 获得两个日期之间的日期集合
     *
     * @param startDate 开始日期：格式yyyyMMdd
     * @param endDate   结束日期: 格式yyyyMMdd
     * @return 日期集合: 包含开始日期，结束日期
     */
    public static List<String> getBetweenDate(String startDate, String endDate) {
        List<String> list = new ArrayList<>();
        if (StringUtils.isEmpty(startDate) || StringUtils.isEmpty(endDate)) {
            return list;
        }
        Date start = DateUtil.parse(startDate, DateUtil.DATE_PATTERN);
        Date end = DateUtil.parse(endDate, DateUtil.DATE_PATTERN);
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(start);
        long startTime = start.getTime();
        long endTime = end.getTime();
        while (startTime <= endTime) {
            Date time = calendar.getTime();
            list.add(DateUtil.format(time, DateUtil.DATE_PATTERN));
            calendar.add(Calendar.DAY_OF_YEAR, 1);
            startTime = calendar.getTime().getTime();
        }
        return list;
    }

    /**
     * 获取某月的天数
     *
     * @param date 日期
     * @return int
     */
    public static int getDaysOfMonth(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
    }







    /**
     * 获取某月的天数
     *
     * @param date 日期
     * @return int
     */
    public static boolean isOnlineTime(String date) {
        date = date.substring(0, 4);
        boolean bl = false;
        String s = DateUtil.format(new Date(), MONTHS_PATTERN).substring(0, 4);
        if (date.equals(s)) {
            bl = true;
        }
        return bl;
    }

    /**
     * 获取上个月的第一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getLastYear(Date date) {
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN);
        cal.setTime(date);
        cal.add(Calendar.YEAR, -1);
        return sdf.format(cal.getTime()).substring(0, 4);
    }


    /**
     * 获取上个月的第一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getYFKMonth(String date) {
        String month = "";
        try {
            String a = DateUtil.getLastDayOfLastMonth(date);
            String b = a.substring(4, 6);
            String c = b.substring(0, 1);
            if ("0".equals(c)) {
                month = b.substring(1, 2);
            } else {
                month = b;
            }
        } catch (Exception e) {
            log.error("日期转换异常:{}", e);
        }
        return month;
    }


    /**
     * 获取上两月的第一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String getFirstDayOfSecondMonth(String date) throws ParseException {
        date = date.replaceAll("[-]", "");
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        cal.setTime(sdf.parse(date));
        cal.add(Calendar.MONTH, -2);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        return sdf.format(cal.getTime());
    }




    /**
     * 获取指定日期的下一天
     *
     * @param specifiedDay 指定日期
     * @return 返回值
     */
    public static String getSpecifiedDayAfter(String specifiedDay) {
        Calendar c = Calendar.getInstance();
        Date date = null;
        try {
            date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day + 1);

        String dayAfter = new SimpleDateFormat("yyyy-MM-dd")
                .format(c.getTime());
        return dayAfter;
    }

    /**
     * 获取指定日期的下一天
     *
     * @param specifiedDay 指定日期
     * @return 返回值
     */
    public static Date getSpecifiedDay(String specifiedDay) {
        Calendar c = Calendar.getInstance();
        Date date = null;
        try {
            date = new SimpleDateFormat("yy-MM-dd").parse(specifiedDay);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        c.setTime(date);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day + 1);
        return c.getTime();
    }

    /**
     * 获取指定日期的下一天
     *
     * @param specifiedDay 指定日期
     * @return 返回值
     */
    public static Date getSpecifiedDay(Date specifiedDay) {
        if (null == specifiedDay) {
            return null;
        }
        Calendar c = Calendar.getInstance();
        c.setTime(specifiedDay);
        int day = c.get(Calendar.DATE);
        c.set(Calendar.DATE, day + 1);
        return c.getTime();
    }

    /**
     * 获取指定时间的上个月月初
     *
     * @param monthFirstDay 指定时间
     * @param i             偏移量
     * @return 指定时间的上个月月初
     */
    public static Date subMonth(Date monthFirstDay, int i) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(monthFirstDay);
        cal.add(Calendar.MONTH, i);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        return cal.getTime();
    }

    /**
     * 获取当前年的第一天
     *
     * @param date 指定时间
     * @return Date
     */
    public static Date getYearStartDate(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int currentYear = cal.get(Calendar.YEAR);
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, currentYear);
        Date currYearFirst = calendar.getTime();
        return currYearFirst;
    }


    /**
     * 获取当前年的最后一天
     *
     * @param date 指定时间
     * @return Date
     */
    public static Date getYearLastDate(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int currentYear = cal.get(Calendar.YEAR);
        Calendar calendar = Calendar.getInstance();
        calendar.clear();
        calendar.set(Calendar.YEAR, currentYear);
        calendar.roll(Calendar.DAY_OF_YEAR, -1);
        Date currYearFirst = calendar.getTime();
        return currYearFirst;
    }

    /**
     * 获取时间和当前时间对比
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     */
    public static Long getDateResult(Date date) {
        return date.getTime() - System.currentTimeMillis();
    }

    /**
     * 去除時分秒
     *
     * @param date
     * @return
     * @throws ParseException
     */
    public static Date minus(Date date) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String s = sdf.format(date);
        return sdf.parse(s);
    }


    /**
     * 递归获取指定天数
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static List<String> getLastMonthOfLastMonth(String date, int number, List<String> list) throws ParseException {
        if (number == 0) {
            return list;
        }
        date = date.replaceAll("[-]", "");
        Calendar cal = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM");
        cal.setTime(sdf.parse(date));
        cal.add(Calendar.MONTH, -1);
        int day = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, day);
        list.add(sdf.format(cal.getTime()));
        getLastMonthOfLastMonth(sdf.format(cal.getTime()), number - 1, list);
        return list;
    }

    /**
     * 计算日期月份的差值
     *
     * @param onlineDate yyyyMM
     * @param settleDate yyyyMM
     * @return yyyyMMdd
     * @throws ParseException
     */
    public static String subMonth(String onlineDate, String settleDate) {
        if (onlineDate.contains("-")) {
            onlineDate = onlineDate.replaceAll("-", "");
        }
        if (settleDate.contains("-")) {
            settleDate = settleDate.replaceAll("-", "");
        }
        Date startDate = DateUtil.parse(onlineDate + "01", DateUtil.DATE_PATTERN);
        Date endDate = DateUtil.parse(settleDate + "01", DateUtil.DATE_PATTERN);
        DateTimeFormatter formatter = DateTimeFormat.forPattern(DateUtil.DATE_SHOW_FORMAT);
        DateTime start = formatter.parseDateTime(DateUtil.format(startDate, DateUtil.DATE_SHOW_FORMAT));
        DateTime end = formatter.parseDateTime(DateUtil.format(endDate, DateUtil.DATE_SHOW_FORMAT));
        //end-start 结果可为负数、正数、0
        int months = Months.monthsBetween(end, start).getMonths();
        return String.valueOf(months);
    }

    /**
     * 取当前月份第一天
     *
     * @param date 当前时间
     * @return 当前月第一天
     */
    public static String getMonthsFirstDay(Date date) {
        //获取当前月第一天：
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.MONTH, 0);
        c.set(Calendar.DAY_OF_MONTH, 1);//设置为1号,当前日期既为本月第一天
        String first = DateUtil.format(c.getTime(), DATE_SHOW_FORMAT);
        return first;
    }


    /**
     * 取当前月最后一天
     *
     * @param date 当前时间
     * @return 当前月最后一天
     */
    public static String getMonthsLastDay(Date date) {
        Calendar ca = Calendar.getInstance();
        ca.setTime(date);
        ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH));
        String last = DateUtil.format(ca.getTime(), DATE_SHOW_FORMAT);
        return last;
    }


    /**
     * 日期增减，负数为减
     *
     * @param date  日期
     * @param month 月份
     * @return 时间
     */
    public static Date plusMonths(Date date, int month) {
        return new DateTime(date).plusMonths(month).toDate();
    }

    /**
     * 获取下个月的第一天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     */
    public static Date getFirstDayNextMonth(Date date) throws ParseException {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, 1);
        int day = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, day);
        cal.set(Calendar.HOUR_OF_DAY, 0);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        return DateUtil.minus(cal.getTime());
    }

    /**
     * 向后推移N天
     *
     * @param date yyyyMMdd 或者 yyyy-MM-dd
     * @return yyyyMMdd
     */
    public static Date getDateAfter(Date date, long count) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(calendar.DATE, (int) count);
        return calendar.getTime();
    }

    /**
     * 向后推移N天
     *
     * @param start 开始日期
     * @param end   结束日期
     * @return yyyyMMdd
     */
    public static Long betweenDate(Date start, Date end) {
        long days = (start.getTime() - end.getTime()) / (60 * 60 * 24 * 1000);
        return days;
    }
}